package com.servitware.cardio.dokstat;

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.apache.commons.io.FileUtils;

import com.servitware.cardio.domain.transport.SesionTx;
import com.servitware.cardio.domain.transport.SolicitudTx;

public class WorkingDirsFileManager
{
	private WorkingDirs wDirs;

	
	public WorkingDirsFileManager(WorkingDirs wDirs)
	{
		this.wDirs = wDirs;
	}

	/**
	 * Basicamente en este sistema no se usa, es invocada por las funciones
	 * <code>moveToxxxx()</code>
	 * 
	 * @param fileName
	 * @param orig
	 * @param dest
	 */
	public void moveFileToDir(String fileName, Directorios orig, Directorios dest)
	{
		File from = new File(wDirs.getDir(orig.getid()) + File.separator + fileName);
		
		
		if (!from.exists())
			return;

		if ( !wDirs.getDir(dest.getid()).exists() )
			return;

		if ( !wDirs.getDir(dest.getid()).isDirectory() )
			return;

		
		File dirTo = wDirs.getDir( dest.getid() );
		
		
		try
		{
			FileUtils.copyFileToDirectory(from, dirTo);
			from.delete();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		
	}

	
	/**
	 * Mueve todos los archivos de carpeta ENProceso a Procesados
	 * 
	 * --
	 * 
	 * Es en procesados, donde se crea el Informe, una vez que los files han
	 * sido movidos a esa carpeta
	 * 
	 */
	public void moveFilesEnProcesoToProcesado()
	{

		File[] files = wDirs.getDir(WorkingDirs.DIR_EN_PROCES0).listFiles();

		try
		{
			for (File file : files)
			{
				FileUtils.copyFile(file,
						new File(wDirs.getDir(WorkingDirs.DIR_PROCESADO).getAbsolutePath() + File.separator + file.getName()));
				file.delete();
			}
		}
		catch (IOException e)
		{

		}

	}

	
	/**
	 * Mueve archivo de solicitud EnProceso, a Pendiente
	 * 
	 * --
	 * 
	 */
	public void moveFileEnProcesoAPendiente(String fileName)
	{
		if( fileName == null )
			return;
		
		moveFileToDir( fileName, Directorios.En_Proceso, Directorios.Pendiente );
	}

	
	/**
	 * Si no existe un archivo en Proceso, obviamos el paso a Pendiente.
	 * 
	 * El archivo va directamente a EnProceso
	 * 
	 * --
	 * 
	 */
	public void moveJustONEFileDescargadoAProceso(SolicitudTx solicitudTx)
	{
		if( solicitudTx == null )
			return;
		
		if( solicitudTx.getSesionTx() == null )
			return;
		
		if( solicitudTx.getSesionTx().getNombreArchivo() == null )
			return;
		
		moveFileToDir(solicitudTx.getSesionTx().getNombreArchivo(), Directorios.Descarga, Directorios.En_Proceso);
	}

	
	
	/**
	 * Mueve todos los archivos de carpeta ENProceso a Procesados
	 * 
	 * --
	 * 
	 * Es en procesados, donde se crea el Informe, una vez que los files han
	 * sido movidos a esa carpeta
	 * 
	 */
	public void moveFilesDescargadosAPendiente(List<SolicitudTx> lst)
	{
		if( lst == null )
			return;
		
		if( lst.size() < 1 )
			return;
		
		
		for (SolicitudTx s : lst)
		{
			SesionTx sTx = s.getSesionTx();
			
			String file = sTx.getNombreArchivo();
			
			if( file == null )
				return;
			
			moveFileToDir( file, Directorios.Descarga, Directorios.Pendiente);
		}
	}

	
	
	/**
	 * Mueve archivo de solicitud a procesar, de Pendiente a EnProceso
	 * 
	 * @param fileName
	 */
	public void moveFileToEnProceso(String fileName)
	{
		moveFileToDir(fileName, Directorios.Pendiente, Directorios.En_Proceso);
	}

	
	/**
	 * /** Mueve archivo de solicitud a suspender, de EnProceso a Suspendida
	 * 
	 * @param fileName
	 */
	public void moveFileToSuspendido(String fileName)
	{
		moveFileToDir(fileName, Directorios.En_Proceso, Directorios.Suspendido);
	}

	
	/**
	 * Mueve file de Procesado a Subido
	 * 
	 * @param fileName
	 */
	public void moveFileToSubido(String fileName)
	{
		moveFileToDir(fileName, Directorios.Procesado, Directorios.Subido);
	}

	
	/**
	 * Mueve archivo de solicitud Suspendida a EnProceso
	 * 
	 * @param fileName
	 */
	public void moveFileRetomarEnProceso(String fileName)
	{
		moveFileToDir(fileName, Directorios.Suspendido, Directorios.En_Proceso);
	}

	/**
	 * Mueve archivo de solicitud Suspendida a EnProceso
	 * 
	 * @param fileName
	 */
	public void moveFileProcesadoToEnProceso(String fileName)
	{
		moveFileToDir(fileName, Directorios.Procesado, Directorios.En_Proceso);
	}

	/**
	 * Retorna directorios de Trabajo
	 * @return
	 */
	public WorkingDirs getWorkingDirs()
	{
		return wDirs;
	}
}
